package com.searching.core.dao;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.commons.io.IOUtils;

import javax.sql.DataSource;
import java.io.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.function.Predicate;


//工厂模式＋单例模式
/*DAO:data access object:数据访问对象*/



public class DataSourceFactory {
    /*
    数据源（单例）
    * */
    //volatile关键字
    /**
     * volatile作用：多线程环境下保证单例模式只创建一个对象
     */
    private static volatile DruidDataSource dataSource;

    private DataSourceFactory() {
    }

    public static DataSource dataSource() {
        if (dataSource == null) {
            //内建锁锁住DataSourceFactory类
            synchronized (DataSourceFactory.class) {
                if (dataSource == null) {
                    //实例化
                    dataSource = new DruidDataSource();
                    dataSource.setDriverClassName("org.h2.Driver");//反射生成对象
                    //URL，username,password
                    //采用h2的嵌入式数据库，数据库在本地

                    //getProperty的用法：
                    String workDir = System.getProperty("user.dir");//获取当前工作目录
                    //JDBC规范关于H2 jdbc:h2:filepath->存储到本地文件
                    //JDBC规范关于H2 jdbc:h2:~/filepath->存储到当前用户的home目录
                    //JDBC规范中关于H2 jdbc:h2://ip:port/databaseName->存储到服务器


                    //File.separator:表示路径分割符
                    dataSource.setUrl("jdbc:h2:" + workDir + File.separator + "searching");
                    //dataSource.setValidationQuery("select now()");
                }
            }
        }

        return dataSource;

    }

    public static void initDatabase() {
        //1.获取数据源
        DataSource dataSource = DataSourceFactory.dataSource();
        //2，获取SQL语句
        //不采取读取绝对路径文件
        //采取读取classpath路径下的文件
        //try-with-resources：自动关闭流

        try (InputStream in = DataSourceFactory.class.getClassLoader().
                getResourceAsStream("searching.sql");) {
            if (in == null) {
                throw new RuntimeException("didn't read init database script ,please check it .");
            }
            StringBuilder sqlBuilder = new StringBuilder();
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(in));) {
                String line = null;
                while ((line = reader.readLine()) != null) {
                    if (!line.startsWith("--")) {
                        sqlBuilder.append(line);
                    }
                }
            }
            //3.通过数据库连接和名称执行SQL
            String sql = sqlBuilder.toString();
            //JDBC
            //3.1获取数据库的链接
            Connection connection = dataSource.getConnection();
            //3.2创建命令
            PreparedStatement statement = connection.prepareStatement(sql);
            //3.3执行SQL语句
            statement.execute();
            connection.close();
            statement.close();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
//        classLoader？？

//        DataSourceFactory.class.getClassLoader().getResourceAsStream("searching.sql");

    }

    public static void main(String[] args) {
//        String path = System.getProperty("user.dir");
//        System.out.println(path);
//        DataSource dataSource = DataSourceFactory.dataSource();
//        System.out.println(dataSource);

      DataSourceFactory.initDatabase();
    }
}



















//public class DataSourceFactory {
//
//    /**
//     * 数据源（单例）
//     */
//    private static volatile DruidDataSource dataSource;
//
//    private DataSourceFactory() {
//
//    }
//
//    public static DataSource dataSource() {
//        if (dataSource == null) {
//            synchronized(DataSourceFactory.class) {
//                if (dataSource == null) {
//                    //实例化
//                    dataSource = new DruidDataSource();
//                    //JDBC  driver class
//                    dataSource.setDriverClassName("org.h2.Driver");
//                    //url, username, password
//                    //采用的是H2的嵌入式数据库，数据库以本地文件的方式存储，只需要提供url接口
//                    //JDBC规范中关于MySQL jdbc:mysql://ip:port/databaseName
//                    //JDBC规范中关于H2 jdbc:h2:filepath ->存储到本地文件
//                    //JDBC规范中关于H2 jdbc:h2:~/filepath ->存储到当前用户的home目录
//                    //JDBC规范中关于H2 jdbc:h2://ip:port/databaseName ->存储到服务器
////                    dataSource.setUrl("jdbc:h2:" + EverythingPlusConfig.getInstance().getH2IndexPath());
//
//                    String workDir = System.getProperty("user.dir");//获取当前工作目录
//                    //JDBC规范关于H2 jdbc:h2:filepath->存储到本地文件
//                    //JDBC规范关于H2 jdbc:h2:~/filepath->存储到当前用户的home目录
//                    //JDBC规范中关于H2 jdbc:h2://ip:port/databaseName->存储到服务器
//
//
//                    //File.separator:表示路径分割符
//                    dataSource.setUrl("jdbc:h2:" + workDir + File.separator + "searching");
//                    //Druid数据库连接池的可配置参数
//                    //https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
//                    //第一种
//                    dataSource.setValidationQuery("select now()");
////                    第二种
////                    dataSource.setTestWhileIdle(false);
//                }
//            }
//        }
//        return dataSource;
//    }
//
//    public static void initDatabase() {
//        //1.获取数据源
//        DataSource dataSource = DataSourceFactory.dataSource();
//        //2.获取SQL语句
//        //不采取读取绝对路径文件
////        E:\worskpace\java4\everything-plus\src\main\resources\everything_plus.sql
//        //采取读取classpath路径下的文件
//        //try-with-resources
//        try (InputStream in = DataSourceFactory.class.getClassLoader().getResourceAsStream("everything_plus.sql");) {
//            if (in == null) {
//                throw new RuntimeException("Not read init database script please check it");
//            }
//            StringBuilder sqlBuilder = new StringBuilder();
//            try (BufferedReader reader = new BufferedReader(new InputStreamReader(in));) {
//                String line = null;
//                while ((line = reader.readLine()) != null) {
//                    if (!line.startsWith("--")) {
//                        sqlBuilder.append(line);
//                    }
//                }
//            }
//            //3.获取数据库连接和名称执行SQL
//            String sql = sqlBuilder.toString();
//            //JDBC
//            //3.1获取数据库的连接
//            Connection connection = dataSource.getConnection();
//            //3.2创建命令
//            PreparedStatement statement = connection.prepareStatement(sql);
//            //3.3执行SQL语句
//            statement.execute();
//            connection.close();
//            statement.close();
//        } catch (IOException | SQLException e) {
//            e.printStackTrace();
//        }
//    }
//
//
//    public static void main(String[] args) {
////        演示IO包的读文件
//
//        try (InputStream in = DataSourceFactory.class.getClassLoader().getResourceAsStream("everything_plus.sql");) { String sql = IOUtils.toString(in);
////            System.out.println(sql);
////            IOUtils.readLines(in)
////                    .stream()
////                    .filter(new Predicate<String>() {
////                        @Override
//                        public boolean test(String line) {
//                            return !line.startsWith("--");
//                        }
//                    })
//                    .forEach(line -> System.out.println(line));
//        } catch (IOException e) {
//        }
////        DataSourceFactory.initDatabase();
//    }
//}



